HTML 和 XHTML 的文档类型定义(DTD)
表面上看,HTML 和 XHTML 显得杂乱无章,但实际上 W3C(World Wide Web Consortium,万维网联盟,制订 Web 标准的权威组织)为 HTML 和 XHTML 制订了严格的语义约束。W3C 组织使用 DTD (Document Type Definition,文档类型定义)来定义 HTML 和 XHTML 的语义约束,包括 HTML 文档中可以出现哪些元素,各元素支持哪些属性等。
打开 HTML4.01 的 DTD 文档(网址:http://www.w3.org/TR/html401/loose.dtd),在该文档中可以看到如下片段:
<!ELEMENT BODY O O (%flow;)* +(INS|DEL) -- document body -->
<!ATTLIST BODY
%attrs; -- %coreattrs, %i18n, %events --
onload %Script; #IMPLIED -- the document has been loaded --
onunload %Script; #IMPLIED -- the document has been removed --
background %URI; #IMPLIED -- texture tile for document background --
%bodycolors; -- bgcolor, text, link, vlink, alink --
>
上面的 DTD 片段定义了 BODY(全部大写)元素可以支持 %attrs 指定的各种通用属性;除此之外,BODY 元素还可以指定 onload、onunload、background、bgcolor、text、link、vlink、alink 这些属性。
对 HTML 有一定熟悉的人可能经常看到 BODY 标签(也叫 BODY 标记)的说法,在 HTML 语言中,经常会发生把元素称为标签的情况。但实际上按标准说法,应该称为 BODY 元素。比如上面的 DTD 片段使用了 ELEMENT 来定义 BODY 元素。
BODY 元素能接受的子元素则由 %flow 来决定,它是一个参数实体引用,这个参数实体的定义如下:
<!ENTITY %flow "%block; | %inline;">
其中 %block 也是一个参数实体引用,它代表换行的“块模型”的 HTML 元素,它的定义如下:
<!ENTITY %block
"P | %heading; | %list; | %preformatted; | DL | DIV | CENTER | NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR | TABLE | FIELDSET | ADDRESS">
其中 %inline 也是一个参数实体引用,它代表不换行的“行内” HTML 元素,它的定义如下:
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
再打开 XHTML 1.0的 DTD 文档(网址:http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd),在该文档中可以看到如下片段:
<!ELEMENT body %Flow;>
<!ATTLIST body
%attrs;
onload %Script; #IMPLIED
onunload %Script; #IMPLIED
background %URI; #IMPLIED
bgcolor %Color; #IMPLIED
text %Color; #IMPLIED
link %Color; #IMPLIED
vlink %Color; #IMPLIED
alink %Color; #IMPLIED
>
上面的 DTD 片段同样详细定义了 body 元素可包含哪些子元素,body 元素除了支持 %attrs 指定的各种通用属性外,body 元素还可以指定 onload、onunload、background、bgcolor、text、link、vlink、alink 这些属性。body 元素可包含的子元素由 %Flow 参数实体引用定义,该参数实体的定义如下:
<!ENTITY %Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
通过上面的对比不难发现,HTML4.01 与 XHTML 基本相似,只是 HTML4.01 允许元素使用大写字母,而 XHTML 则要求所有元素、属性都必须是小写字母。
无论是 HTML4.01 还是 XHTML,它们都有 DTD 作为语义约束。也就是说,它们都有严格的规范标准,但实际上很少有 HTML 页面完全遵守 HTML4.01 或 XHTML 规范。在这样的背景下,WHATWG (Web Hypertext Application Technology Working Group,Web 超文本应用技术工作组)制订了一个新的 HTML 标准,即 HTML5。